﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using ECOSYSTEM_BL;
using ECOSYSTEM_Dominio;

namespace ECOSYSTEMPRESENTACION
{
    public partial class frmProforma : Form, Interfaz
    {
        public frmProforma()
        {
            InitializeComponent();
        }
        ClienteBL elClienteBl = new ClienteBL();
        TemporalBL elTemporalBL = new TemporalBL();
        Proforma laProforma = new Proforma();
        Proforma.DetalleProforma elDetalleProforma = new Proforma.DetalleProforma();
        ProformaBL laProformaBL = new ProformaBL();
        List<Temporal> lista;
        Double IGV, TasaCambio, MontoTotal = 0;
        Int32 res,Codigo, CodigoProforma;
        String Moneda;
        private Proforma ObtenerObjetoProforma() {
            laProforma.NroProforma = txtNroProforma.Text;
            laProforma.FecEmisProf = dtpFecha.Text;
            laProforma.TipoMoneda = cmbTipoMoneda.Text;
            laProforma.TipoCambio = txtTCambioComprob.Text;
            laProforma.DescripGaranProf = txtGarantia.Text;
            if(txtEspecificacionProforma.Text=="")
                laProforma.EspecProf = "SIN ESPECIFICACION";
            else
                laProforma.EspecProf = txtEspecificacionProforma.Text;
            laProforma.TotalProf = Convert.ToDouble(MontoTotal);
            laProforma.elClienteID = Convert.ToString(cmbRazonSocial.SelectedValue);
            return laProforma;
        }
        private Boolean GuardarProforma() {
            Proforma laProforma = ObtenerObjetoProforma();
            CodigoProforma = laProformaBL.guardarProforma(laProforma);
            GuardarDetalleProforma();
            return true;
        }
        private Boolean ActualizarProforma() {
            Proforma laProforma = ObtenerObjetoProforma();
            CodigoProforma = Convert.ToInt32(lblProformaID.Text);
            if(txtNroProforma.Text == lblNroProforma.Text)
                laProformaBL.ActualizaProforma(laProforma, Convert.ToInt32(lblProformaID.Text), "");
            else
                laProformaBL.ActualizaProforma(laProforma, Convert.ToInt32(lblProformaID.Text), txtNroProforma.Text);
            GuardarDetalleProforma();
            return true;
        }
        private void GuardarDetalleProforma()
        {
            for (int i = 0; i <= dgvDetalleProforma.Rows.Count - 1; i++)
            {
                    EnviarDatosBD(Convert.ToInt32(dgvDetalleProforma["CantidadProd", i].Value), Convert.ToDouble(dgvDetalleProforma["PrecioUnit", i].Value), Convert.ToInt32(dgvDetalleProforma["CodigoProducto", i].Value), CodigoProforma, Convert.ToString(dgvDetalleProforma["Identificador",i].Value));
            }
            EliminarProductosLista();
        }
        private Boolean EnviarDatosBD(Int32 Cantidad, Double PrecioVentaUnit, Int32 IDProducto, Int32 IDProformaID, String Identificador)
        {
            elDetalleProforma.CantidadProd = Cantidad;
            elDetalleProforma.PrecioProf = PrecioVentaUnit;
            elDetalleProforma.elProducto = IDProducto;
            elDetalleProforma.laProforma = IDProformaID;
            if(Identificador == "N")
                laProformaBL.guardarDetalleProforma(elDetalleProforma);
            if (Identificador == "A")
                laProformaBL.ActualizarDetalleProforma(elDetalleProforma);
            return true;
        }
        private void EliminarProductosLista() {
            if (dgvProductosEliminar.Rows.Count > 0) {
                for (int i = 0; i <= dgvProductosEliminar.Rows.Count - 1; i++) {
                    laProformaBL.EliminarProductoListaDetalle(Convert.ToInt32(dgvProductosEliminar["ProductoID", i].Value), Convert.ToInt32(dgvProductosEliminar["ProformaID", i].Value));
                }
            }
        }
        public void LlenarComboCliente()
        {
            if (cmbRazonSocial.DataSource == null)
            {
                cmbRazonSocial.DataSource = elClienteBl.ObtenerClientes("Todos");
                cmbRazonSocial.DisplayMember = "Cliente";
                cmbRazonSocial.ValueMember = "RUC-DNI";
                cmbRazonSocial.Text = "";
            }
        }
        public void ActivarMenu(bool Opcion)
        {
            throw new NotImplementedException();
        }
        public void CargarDatosCliente(string Nombre, string Ruc, string Direccion)
        {
            try
            {
                cmbRazonSocial.Text = Nombre;
                txtTelefonoCliente.Text = Ruc;
                txtDirecCliente.Text = Direccion;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        public void CargardatosProducto(string NomProd, string Cantidad, string PrecioVenta, string CodProd)
        {
            try
            {
                if (Moneda != "SOLES" && txtTCambioComprob.Text == "SOLES")
                {
                    if (MessageBox.Show("El producto fue registrado en DOLARES pero la Venta es en SOLES\n¿Desea Convertirlo en SOLES?", "Conversion de Moneda", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                    {
                        txtPrecioUnit.Text = String.Format("{0:F}", Convert.ToDouble(PrecioVenta) * TasaCambio);
                    }
                    else
                        txtPrecioUnit.Text = PrecioVenta;
                }
                if (Moneda == "SOLES" && txtTCambioComprob.Text == "SOLES")
                {
                    txtPrecioUnit.Text = String.Format("{0:F}", PrecioVenta);
                }
                if (Moneda == "SOLES" && txtTCambioComprob.Text != "SOLES")
                {
                    if (MessageBox.Show("El producto fue registrado en SOLES pero la Venta es en DOLARES\n¿Desea Convertirlo en DOLARES?", "Conversion de Moneda", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                    {
                        txtPrecioUnit.Text = String.Format("{0:F}", Convert.ToDouble(PrecioVenta) / TasaCambio);
                    }
                    else
                        txtPrecioUnit.Text = PrecioVenta;
                }
                if (Moneda != "SOLES" && txtTCambioComprob.Text != "SOLES")
                {
                    txtPrecioUnit.Text = String.Format("{0:F}", PrecioVenta);
                }
                txtProducto.Text = NomProd;
                lblCodigoProducto.Text = CodProd;
                txtCantidad.Text = "1";
                txtCantidad.Select();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }
        public void LlenarDatosCliente(String RucBuscar)
        {
            List<Cliente> lista;
            lista = elClienteBl.BuscarClienteID(Convert.ToString(cmbRazonSocial.SelectedValue));
            foreach (Cliente fila in lista)
            {
                this.txtTelefonoCliente.Text = fila.TelefCliente.ToString();
                this.txtDirecCliente.Text = fila.DirecCliente.ToString();
            }
        }
        public void ObtenerTCambio()
        {
            lista = elTemporalBL.ObtenerActualesDatos();
            foreach (Temporal fila in lista)
            {
                TasaCambio = fila.TasaCambio;
                IGV = fila.IGV;
                Moneda = fila.MonedaVentas;
            }
        }
        private void CambiarMoneda(String tipo)
        {
            Double MontoT, PrecioUni;
            if (tipo == "DOLARES")
            {
                for (int i = 0; i <= dgvDetalleProforma.Rows.Count - 1; i++)
                {
                    MontoT = Convert.ToDouble(dgvDetalleProforma["Total", i].Value) / Convert.ToDouble(txtTCambioComprob.Text);
                    PrecioUni = MontoT / Convert.ToInt32(dgvDetalleProforma["CantidadProd", i].Value);
                    dgvDetalleProforma["PrecioUnit", i].Value = String.Format("{0:F}",PrecioUni);
                    dgvDetalleProforma["Total", i].Value = String.Format("{0:F}", MontoT);
                }
            }
            if (tipo == "SOLES")
            {
                for (int i = 0; i <= dgvDetalleProforma.Rows.Count - 1; i++)
                {
                    MontoT = Convert.ToDouble(dgvDetalleProforma["Total", i].Value) * TasaCambio;
                    PrecioUni = MontoT / Convert.ToInt32(dgvDetalleProforma["CantidadProd", i].Value);
                    dgvDetalleProforma["PrecioUnit", i].Value = String.Format("{0:F}", PrecioUni);
                    dgvDetalleProforma["Total", i].Value = String.Format("{0:F}", MontoT);
                }
            }
        }
        public void CalcularMonto()
        {
            MontoTotal = 0;
            for (int i = 0; i <= dgvDetalleProforma.Rows.Count - 1; i++)
            {
                MontoTotal = MontoTotal + Convert.ToDouble(dgvDetalleProforma["Total", i].Value);
            }
            if (cmbTipoMoneda.Text == "DOLARES")
            {
                txtTotal.Text = String.Format("{0:$ #,##0.00}", MontoTotal);
            }
            if (cmbTipoMoneda.Text == "SOLES")
            {
                txtTotal.Text = String.Format("{0:C}", MontoTotal);
            }
        }
        private Int32 VerificarListaProductoRepetido()
        {
            for (int i = 0; i <= dgvDetalleProforma.Rows.Count - 1; i++)
            {
                if (lblCodigoProducto.Text == Convert.ToString(dgvDetalleProforma["CodigoProducto", i].Value))
                {
                    res = 1;
                    break;
                }
                else res = 0;
            }
            return res;
        }
        private void GenerarCodigoProforma() {
            Codigo = laProformaBL.ObtenerCodigoProforma();
            Int32 CodifoProforma = Codigo + 1;
            txtNroProforma.Text = String.Format("{0:D5}", CodifoProforma);
        }
        public void CargarListaDetalleProforma(Int32 CodProformaID) {
            try
            {
                List<Proforma.DetalleProforma> lista;
                lista = laProformaBL.ObtenerDetalleProformaEmitida(CodProformaID);
                if (lista.Count > 0) {
                    foreach (Proforma.DetalleProforma fila in lista)
                    {
                        dgvDetalleProforma.Rows.Add(fila.CantidadProd,fila.NameProduc,String.Format("{0:F}",fila.PrecioProf),String.Format("{0:F}",fila.CantidadProd*fila.PrecioProf),fila.elProducto,"R");
                    }
                    CalcularMonto();
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }
        public void HabiltarCampos() {
            groupBox2.Enabled = true;
            groupBox3.Enabled = true;
            groupBox4.Enabled = true;
            btnBuscar.Enabled = false;            
        }
        public void InhabilitarCampos() {
            groupBox2.Enabled = false;
            groupBox3.Enabled = false;
            groupBox4.Enabled = false;
            btnBuscar.Enabled = true;
            btnCancelar.Enabled = false;
            btnNuevo.Enabled = true;
            btnGuardar.Enabled = false;
            btnActualizar.Enabled = false;
        }
        public void LimpiarCampos() {
            txtNroProforma.Text = "";
            cmbTipoMoneda.SelectedIndex = 1;
            cmbRazonSocial.DataSource = null;
            txtTelefonoCliente.Text = "";
            txtDirecCliente.Text = "";
            txtProducto.Text = "";
            txtCantidad.Text = "";
            lblCodigoProducto.Text = "";
            if(dgvDetalleProforma.Rows.Count>0)
                dgvDetalleProforma.Rows.Clear();
            txtEspecificacionProforma.Text = "";
            txtGarantia.Text = "24 MESES";
            txtTotal.Text = "0.00";
        }

        //--> EVENTOS <--

        private void btnAgregarProd_Click(object sender, EventArgs e)
        {
            frmBuscarProducto busProd = new frmBuscarProducto();
            busProd.MdiParent = this.MdiParent;
            busProd.Show();
        }

        private void btnNuevoCliente_Click(object sender, EventArgs e)
        {
            cmbRazonSocial.Text = "";
            txtTelefonoCliente.Text = "";
            txtDirecCliente.Text = "";
            frmCliente formCliente = new frmCliente();
            formCliente.MdiParent = this.MdiParent;
            formCliente.NameFormulario = "frmCliente";
            formCliente.Manipular = this;
            formCliente.btnBuscar.Visible = false;
            formCliente.btnActualizar.Visible = false;
            formCliente.btnCancelar.Enabled = false;
            formCliente.Show();
        }       

        private void btnNuevo_Click(object sender, EventArgs e)
        {
            try
            {
                HabiltarCampos();
                GenerarCodigoProforma();
                LlenarComboCliente();
                cmbRazonSocial.Select();
                btnCancelar.Enabled = true;
                btnNuevo.Enabled = false;
                btnGuardar.Enabled = true;
                LimpiarCampos();
                cmbTipoMoneda.SelectedIndex = 1;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            try
            {
                LimpiarCampos();
                InhabilitarCampos();                
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }        
        }

        private void btnBuscarProducto_Click(object sender, EventArgs e)
        {
            try
            {
                frmBuscarProducto formBusProd = new frmBuscarProducto();
                formBusProd.MdiParent = this.MdiParent;
                formBusProd.Manipular = this;
                formBusProd.NameFormulario = "frmProforma";
                formBusProd.Show();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void cmbRazonSocial_SelectionChangeCommitted(object sender, EventArgs e)
        {
            try
            {
                LlenarDatosCliente(Convert.ToString(cmbRazonSocial.SelectedValue));
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void cmbRazonSocial_KeyUp(object sender, KeyEventArgs e)
        {
            try
            {
                LlenarDatosCliente(Convert.ToString(cmbRazonSocial.SelectedValue));
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void btnAgregarProducto_Click(object sender, EventArgs e)
        {
            try
            {
                if (VerificarListaProductoRepetido() == 0)
                {
                    Int32 Cantidad = Convert.ToInt32(txtCantidad.Text);
                    Double Monto = Convert.ToDouble(txtPrecioUnit.Text) * Cantidad;
                    dgvDetalleProforma.Rows.Add(Cantidad, txtProducto.Text,String.Format("{0:F}",Convert.ToDouble(txtPrecioUnit.Text)),String.Format("{0:F}",Monto), lblCodigoProducto.Text,"N" );
                    CalcularMonto();
                    txtProducto.Text = "";
                    txtCantidad.Text = "";
                    txtPrecioUnit.Text = "";
                }
                else
                    MessageBox.Show("El Producto ya se encuentra en la lista ?");
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void cmbTipoMoneda_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                if (cmbTipoMoneda.SelectedIndex == 0)
                {
                    txtTCambioComprob.ReadOnly = false;
                    if (dgvDetalleProforma.Rows.Count == 0)
                        txtTCambioComprob.Text = Convert.ToString(TasaCambio);
                    else
                    {
                        txtTCambioComprob.Text = Convert.ToString(TasaCambio);
                        CambiarMoneda("DOLARES");
                        CalcularMonto();
                    }
                }
                else if (cmbTipoMoneda.SelectedIndex == 1)
                {
                    txtTCambioComprob.ReadOnly = true;
                    if (dgvDetalleProforma.Rows.Count == 0)
                        txtTCambioComprob.Text = "SOLES";
                    else
                    {
                        txtTCambioComprob.Text = "SOLES";
                        CambiarMoneda("SOLES");
                        CalcularMonto();
                    }
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void frmProforma_Load(object sender, EventArgs e)
        {
            try
            {
                ObtenerTCambio();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                GuardarProforma();                
                MessageBox.Show("Proforma Registrada Correctamente");
                LimpiarCampos();
                InhabilitarCampos();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void dgvDetalleProforma_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                if (e.ColumnIndex == dgvDetalleProforma.Columns["DeleteProd"].Index)
                {
                    if (MessageBox.Show("ESTA SEGURO DE ELIMINAR EL PRODUCTO", "ELIMINAR PRODUCTO", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                    {
                        if (Convert.ToString(dgvDetalleProforma["Identificador", e.RowIndex].Value) == "R")
                        {
                            dgvProductosEliminar.Rows.Add(dgvDetalleProforma["CodigoProducto", e.RowIndex].Value, lblProformaID.Text);
                        }
                        dgvDetalleProforma.Rows.RemoveAt(e.RowIndex);
                        MontoTotal = 0;
                        CalcularMonto();
                    }
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void dgvDetalleProforma_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                if (e.ColumnIndex != dgvDetalleProforma.Columns["DeleteProd"].Index)
                {
                    Int32 nroFila = Int32.Parse(e.RowIndex.ToString());
                    lblNroFila.Text = Convert.ToString(nroFila);
                    txtProducto.Text = Convert.ToString(dgvDetalleProforma["NameProduc", nroFila].Value);
                    txtCantidad.Text = Convert.ToString(dgvDetalleProforma["CantidadProd", nroFila].Value);
                    txtPrecioUnit.Text = Convert.ToString(dgvDetalleProforma["PrecioUnit", nroFila].Value);
                    lblCodigoProducto.Text = Convert.ToString(dgvDetalleProforma["CodigoProducto", nroFila].Value);
                    dgvDetalleProforma.Enabled = false;
                    btnAgregarProducto.Visible = false;
                    btnUpdateProduc.Visible = true;
                    btnCancelarUpdate.Visible = true;
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void btnCancelarUpdate_Click(object sender, EventArgs e)
        {
            try
            {
                txtProducto.Text = "";
                txtCantidad.Text = "";
                txtPrecioUnit.Text = "";
                lblCodigoProducto.Text = "";
                lblNroFila.Text = "";
                btnAgregarProducto.Visible = true;
                btnUpdateProduc.Visible = false;
                btnCancelarUpdate.Visible = false;
                dgvDetalleProforma.Enabled = true;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void btnUpdateProduc_Click(object sender, EventArgs e)
        {
            Int32 nroFila = Convert.ToInt32(lblNroFila.Text);
            dgvDetalleProforma["CantidadProd", nroFila].Value = txtCantidad.Text;
            dgvDetalleProforma["NameProduc", nroFila].Value = txtProducto.Text;
            dgvDetalleProforma["PrecioUnit", nroFila].Value = String.Format("{0:F}",Convert.ToDouble(txtPrecioUnit.Text));
            dgvDetalleProforma["Total", nroFila].Value = String.Format("{0:F}", Convert.ToDouble(txtPrecioUnit.Text) * Convert.ToDouble(txtCantidad.Text));
            dgvDetalleProforma["CodigoProducto", nroFila].Value = lblCodigoProducto.Text;
            if (Convert.ToString(dgvDetalleProforma["Identificador", nroFila].Value) == "R")
                dgvDetalleProforma["Identificador", nroFila].Value = "A";
            if (Convert.ToString(dgvDetalleProforma["Identificador", nroFila].Value) == "N")
                dgvDetalleProforma["Identificador", nroFila].Value = "N";
            CalcularMonto();
            txtProducto.Text = "";
            txtCantidad.Text = "";
            txtPrecioUnit.Text = "";
            lblCodigoProducto.Text = "";
            lblNroFila.Text = "";
            btnAgregarProducto.Visible = true;
            btnUpdateProduc.Visible = false;
            btnCancelarUpdate.Visible = false;
            dgvDetalleProforma.Enabled = true;
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            frmBuscarProforma laProfBus = new frmBuscarProforma();
            laProfBus.MdiParent = this.MdiParent;
            laProfBus.Show();
            this.Close();
        }

        private void btnActualizar_Click(object sender, EventArgs e)
        {
            try
            {
                ActualizarProforma();
                MessageBox.Show("PROFORMA ACTUALIZADA CORRECTAMENTE");
                InhabilitarCampos();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }       
    }
}
